﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Windows;
using CalculoPreciosUnitarios.BaseDeDatos.cotizararticuloDataSetTableAdapters;
using CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.Articulos;
using CalculoPreciosUnitarios.Logica.GestorObject.Articulo;
using CalculoPreciosUnitarios.Logica.GestorObject.Porcentuales_Cantidades;
using MySql.Data.MySqlClient;

namespace CalculoPreciosUnitarios.Logica.GestorBaseDeDatos.Porcentuales_Cantidades
{
    public class CargaPorcentualesCantidadesBD
    {
        private IFormatProvider english = new System.Globalization.CultureInfo("es-AR");

        //logica de acceso a BD

        public List<CargaPorcentualesCantidadesCS> obtenerPorcentualesCantidades()
        {

            List<CargaPorcentualesCantidadesCS> _PorcentualesCantidades = new List<CargaPorcentualesCantidadesCS>();
            porcentuales_cantidadesTableAdapter dbPorcentualesCantidades = new porcentuales_cantidadesTableAdapter();
            DataTable tablaPorcentualesCantidades = new DataTable();

            dbPorcentualesCantidades.Connection.Open();
           

            try
            {
                tablaPorcentualesCantidades = dbPorcentualesCantidades.GetData();

                foreach (DataRow items in tablaPorcentualesCantidades.Rows)
                {
                    CargaPorcentualesCantidadesCS datatablaPorcentualesCantidades = new CargaPorcentualesCantidadesCS();
                    datatablaPorcentualesCantidades.CodigoArticulo = items["id_articulo"].ToString();
                    datatablaPorcentualesCantidades.CantidadArticulos = Convert.ToInt16(items["cantidadart"]);
                    datatablaPorcentualesCantidades.ManoDeObra = Convert.ToDecimal(items["manodeobra"], english);
                    datatablaPorcentualesCantidades.GastosFijos = Convert.ToDecimal(items["gastosfijos"], english);
                    datatablaPorcentualesCantidades.Rentabilidad = Convert.ToDecimal(items["rentabilidad"], english);
                    datatablaPorcentualesCantidades.Insumos = Convert.ToDecimal(items["insumo"], english);
                    datatablaPorcentualesCantidades.Iva = Convert.ToDecimal(items["iva"], english);

                    //Convert.ToDateTime(items["fechadealta"]).Date;
                    _PorcentualesCantidades.Add(datatablaPorcentualesCantidades);                  
                }
            }
            catch (Exception mException)
            {
                MessageBox.Show("Error: Classs CargaPorcentualesCantidadesBD - metodo: obtenerArticulos :: " + mException.Message, "Cuidado", MessageBoxButton.OK);                
            }
            finally
            {

            }

            return _PorcentualesCantidades;
        }

        public List<CargaPorcentualesCantidadesCS> busca_Porcentajes_Cantidades_por_Codigo(ArticuloCS _articulo)
        {

            List<CargaPorcentualesCantidadesCS> _detalleArticulos = new List<CargaPorcentualesCantidadesCS>();
            porcentuales_cantidadesTableAdapter dbPorcentajesyCantidades = new porcentuales_cantidadesTableAdapter();
            DataTable tablaPorcentajesyCantidades = new DataTable();

            try
            {
                tablaPorcentajesyCantidades = dbPorcentajesyCantidades.GetDataByCodigo(_articulo.Codigo);

                foreach (DataRow items in tablaPorcentajesyCantidades.Rows)
                {
                    CargaPorcentualesCantidadesCS dataPorcentajesyCantidades = new CargaPorcentualesCantidadesCS();
                    dataPorcentajesyCantidades.CodigoArticulo = items["id_articulo"].ToString();
                    dataPorcentajesyCantidades.CantidadArticulos = Convert.ToInt16(items["cantidadArt"]);
                    dataPorcentajesyCantidades.ManoDeObra = Convert.ToDecimal(items["manodeobra"]);
                    dataPorcentajesyCantidades.GastosFijos = Convert.ToDecimal(items["gastosfijos"]);
                    dataPorcentajesyCantidades.Rentabilidad = Convert.ToDecimal(items["rentabilidad"]);
                    dataPorcentajesyCantidades.Insumos = Convert.ToDecimal(items["insumo"]);
                    dataPorcentajesyCantidades.Iva = Convert.ToDecimal(items["iva"].ToString());

                    _detalleArticulos.Add(dataPorcentajesyCantidades);
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Class :: articulosDB :: busca_Articulo_por_Codigo :: Error :: " + e.Message, "Error", MessageBoxButton.OK);
            }
            finally
            {
            }
            return _detalleArticulos;
        }

        public List<CargaPorcentualesCantidadesCS> busca_Porcentajes_Cantidades_por_CodigoyCantidades(CargaPorcentualesCantidadesCS _articulo)
        {

            List<CargaPorcentualesCantidadesCS> _detalleArticulos = new List<CargaPorcentualesCantidadesCS>();
            porcentuales_cantidadesTableAdapter dbPorcentajesyCantidades = new porcentuales_cantidadesTableAdapter();
            DataTable tablaPorcentajesyCantidades = new DataTable();

            try
            {
                //Filtra la tabla porcentuales por codigo del articulo y la cantidad por el cual se calcula el precio unitario.

                tablaPorcentajesyCantidades = dbPorcentajesyCantidades.GetDataByCodigoCantidad(_articulo.CodigoArticulo, _articulo.CantidadArticulos);

                foreach (DataRow items in tablaPorcentajesyCantidades.Rows)
                {
                    CargaPorcentualesCantidadesCS dataPorcentajesyCantidades = new CargaPorcentualesCantidadesCS();
                    dataPorcentajesyCantidades.CodigoArticulo = items["id_articulo"].ToString();
                    dataPorcentajesyCantidades.CantidadArticulos = Convert.ToInt16(items["cantidadArt"]);
                    dataPorcentajesyCantidades.ManoDeObra = Convert.ToDecimal(items["manodeobra"]);
                    dataPorcentajesyCantidades.GastosFijos = Convert.ToDecimal(items["gastosfijos"]);
                    dataPorcentajesyCantidades.Rentabilidad = Convert.ToDecimal(items["rentabilidad"]);
                    dataPorcentajesyCantidades.Insumos = Convert.ToDecimal(items["insumo"]);
                    dataPorcentajesyCantidades.Iva = Convert.ToDecimal(items["iva"]);

                    _detalleArticulos.Add(dataPorcentajesyCantidades);
                }                
            }
            catch (Exception e)
            {
                MessageBox.Show("Class :: CargaPorcentualesCantidadesBD - metodo :: busca_Porcentajes_Cantidades_por_CodigoyCantidades :: Error :: " + e.Message, "Error", MessageBoxButton.OK);
            }
            finally
            {
            }
            return _detalleArticulos;
        }

        public List<CargaPorcentualesCantidadesCS> alta_Porcentajes(CargaPorcentualesCantidadesCS _articulo)
        {
            int iResult;
            porcentuales_cantidadesTableAdapter tablaPorcentualesYcantidades = new porcentuales_cantidadesTableAdapter();
            ArticuloCS articulo = new ArticuloCS();
            articulo.Codigo = _articulo.CodigoArticulo;
            articulosDB articuloDB = new articulosDB();

            tablaPorcentualesYcantidades.Connection.Open();
            MySqlTransaction mitransaccion = tablaPorcentualesYcantidades.Connection.BeginTransaction();
            try
            {   
                if (articuloDB.busca_Articulo_por_Codigo(articulo).Count > 0)
                {             
                    if ((busca_Porcentajes_Cantidades_por_CodigoyCantidades(_articulo)).Count == 0)
                        iResult = tablaPorcentualesYcantidades.InsertQuery(_articulo.CodigoArticulo, _articulo.CantidadArticulos, _articulo.ManoDeObra, _articulo.GastosFijos, _articulo.Rentabilidad, _articulo.Insumos, _articulo.Iva);
                    else
                    {
                        iResult = 0;
                        MessageBox.Show("El Codigo " + _articulo.CodigoArticulo + " y las cantidades del Articulo " + _articulo.CantidadArticulos + " ya se encuentran", "Información", MessageBoxButton.OK);
                    }

                    if (iResult == 1)
                    {
                        mitransaccion.Commit();
                        //MessageBox.Show("Operacion de inserción exitosa", "Información", MessageBoxButton.OK);
                    }
                }
            }
            catch (Exception e)
            {
                mitransaccion.Rollback();
                MessageBox.Show("Class :: CargaPorcentualesCantidadesBD :: alta_Porcentajes :: Error :: " + e.Message, "Error", MessageBoxButton.OK);
            }
            finally
            {
                tablaPorcentualesYcantidades.Connection.Close();
            }
            ArticuloCS _artAux = new ArticuloCS();
            _artAux.Codigo = _articulo.CodigoArticulo;
            return busca_Porcentajes_Cantidades_por_Codigo(_artAux);
        }

        /**
         * Hecho por Bruno
         * Carga por Excel
         */

        public int alta_PorcentajesPorExcel(CargaPorcentualesCantidadesCS _articulo)
        {
            int iResult = 0;
            porcentuales_cantidadesTableAdapter tablaPorcentualesYcantidades = new porcentuales_cantidadesTableAdapter();
            ArticuloCS articulo = new ArticuloCS();
            articulo.Codigo = _articulo.CodigoArticulo;
            articulosDB articuloDB = new articulosDB();

            tablaPorcentualesYcantidades.Connection.Open();
            MySqlTransaction mitransaccion = tablaPorcentualesYcantidades.Connection.BeginTransaction();
            try
            {
                if (articuloDB.busca_Articulo_por_Codigo(articulo).Count > 0)
                {
                    if ((busca_Porcentajes_Cantidades_por_CodigoyCantidades(_articulo)).Count == 0)
                        iResult = tablaPorcentualesYcantidades.InsertQuery(_articulo.CodigoArticulo, _articulo.CantidadArticulos, _articulo.ManoDeObra, _articulo.GastosFijos, _articulo.Rentabilidad, _articulo.Insumos, _articulo.Iva);
                    
                    if (iResult == 1)
                    {
                        mitransaccion.Commit();
                    }
                }
            }
            catch (Exception e)
            {
                mitransaccion.Rollback();
                MessageBox.Show("Class :: CargaPorcentualesCantidadesBD :: alta_PorcentajesPorExcel :: Error :: " + e.Message, "Error", MessageBoxButton.OK);
            }
            finally
            {
                tablaPorcentualesYcantidades.Connection.Close();
            }

            return iResult;
        }

        public List<CargaPorcentualesCantidadesCS> eliminar_Porcentajes(CargaPorcentualesCantidadesCS _articulo)
        {
            int iResult;
            porcentuales_cantidadesTableAdapter tablaPorcentualesYcantidades = new porcentuales_cantidadesTableAdapter();

            tablaPorcentualesYcantidades.Connection.Open();
            MySqlTransaction mitransaccion = tablaPorcentualesYcantidades.Connection.BeginTransaction();       
            try
            {
                //MessageBox.Show(_articulo.Codigo + " - " + _articulo.Detalle +" - "+_articulo.Precio);
                
                iResult = tablaPorcentualesYcantidades.DeleteQuery(_articulo.CodigoArticulo, _articulo.CantidadArticulos);                
                if (iResult == 1)
                {
                    mitransaccion.Commit();
                    //MessageBox.Show("Operacion de Eliminación exitosa", "Información", MessageBoxButton.OK);
                }
            }
            catch (Exception e)
            {
                mitransaccion.Rollback();
                MessageBox.Show("Class :: articulosDB :: Alta_Articulo :: Error :: " + e.Message, "Error", MessageBoxButton.OK);
            }
            finally
            {
                tablaPorcentualesYcantidades.Connection.Close();
            }
            ArticuloCS _artAux = new ArticuloCS();
            _artAux.Codigo = _articulo.CodigoArticulo;
            return busca_Porcentajes_Cantidades_por_Codigo(_artAux);
        }
        
        public List<CargaPorcentualesCantidadesCS> modificar_Porcentajes(CargaPorcentualesCantidadesCS _porcentuales)
        {
            int iResult;
            porcentuales_cantidadesTableAdapter tablaPorcentualesYcantidades = new porcentuales_cantidadesTableAdapter();

            tablaPorcentualesYcantidades.Connection.Open();
            MySqlTransaction mitransaccion = tablaPorcentualesYcantidades.Connection.BeginTransaction();       
            try
            {
                iResult = tablaPorcentualesYcantidades.UpdateQuery(_porcentuales.ManoDeObra, 
                                                                   _porcentuales.GastosFijos,
                                                                   _porcentuales.Rentabilidad, 
                                                                   _porcentuales.Insumos, 
                                                                   _porcentuales.Iva,
                                                                   _porcentuales.CodigoArticulo, 
                                                                   _porcentuales.CantidadArticulos);
                if (iResult == 1)
                {
                    mitransaccion.Commit();
                   // MessageBox.Show("Operacion de Modificacion exitosa", "Información", MessageBoxButton.OK);
                }
            }
            catch (Exception e)
            {
                mitransaccion.Rollback();
                MessageBox.Show("Class :: articulosDB :: Alta_Articulo :: Error :: " + e.Message, "Error", MessageBoxButton.OK);
            }
            finally
            {
                tablaPorcentualesYcantidades.Connection.Close();
            }
            ArticuloCS _artAux = new ArticuloCS();
            _artAux.Codigo = _porcentuales.CodigoArticulo;
            return busca_Porcentajes_Cantidades_por_Codigo(_artAux);
        }

        public int CargarPorcentuales(List<CargaPorcentualesCantidadesCS> porcentuales)
        {
            int resultadoConsulta = 1;
            CargaPorcentualesCantidadesBD _porcentualesDB = new CargaPorcentualesCantidadesBD();

            if (porcentuales.Count > 0)
            {
                foreach (CargaPorcentualesCantidadesCS item in porcentuales)
                {
                    resultadoConsulta *= _porcentualesDB.alta_PorcentajesPorExcel(item);
                }
            }

            return resultadoConsulta;
        }

    }
}
